package cn.jsc.service.impl;

import cn.jsc.domain.VipUser;
import cn.jsc.dto.registerDto;
import cn.jsc.exception.MyException;
import cn.jsc.mapper.VipUserMapper;
import cn.jsc.result.JSONResult;
import cn.jsc.service.IVipUserService;
import cn.jsc.utils.MD5Utils;
import cn.jsc.utils.StrUtils;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

/**
 * <p>
 * 会员登录账号 服务实现类
 * </p>
 *
 * @author chuanchuan
 * @since 2022-02-12
 */
@Service
public class VipUserServiceImpl extends ServiceImpl<VipUserMapper, VipUser> implements IVipUserService {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private VipUserMapper vipUserMapper;

    /**
     * 用户注册
     * @param dto
     * @return
     */
    @Override
    public JSONResult register(registerDto dto) {
        /**
         * 1. 手机号、密码、用户输入的短信校验码
         * 2. 入参校验
         * 3. 根据手机号去redis获取code，比对，比对成功，账号密码入库，比对失败，提示重发短信
         *
         * 1. 获取用户输入的手机号，短信验证码等信息，全部提交到后台
         * 2. 后台根据手机号去Redis中获取短信验证码和前端传来的短信验证码比对
         * 3. 如果相等，则注册成功，将用户信息存入相关表
         * 4. 如果不相等，告知用户短信验证码错误，请再次发送短信验证码进行注册
         */
        //入参校验

        //根据手机号去redis获取code，比对
        String code = (String)redisTemplate.opsForValue().get(dto.getMobile());
        if(!StringUtils.hasLength(code)){
            //如果redis里面没有验证码值，抛出异常
            throw new MyException("请重新获取短信验证码！");
        }

        if(!code.equalsIgnoreCase(dto.getSmsCode())){//equalsIgnoreCase: 忽略大小写
            //如果redis里面的验证码与用户输入的不一样，抛出异常
            throw new MyException("短信验证码输入错误，请重新输入！");
        }

        //注册成功 用户信息存入相关表
        VipUser user = new VipUser();
        user.setPhone(dto.getMobile());
        //获取随机盐值
        String salt = StrUtils.getComplexRandomString(32);
        //获取加密之后的密码
        String md5Pwd = MD5Utils.encrypByMd5(dto.getPassword()+salt);
        user.setSalt(salt);
        user.setPassword(md5Pwd);
        user.setNickName(dto.getMobile());
        user.setBitState(dto.getRegChannel());

        vipUserMapper.insert(user);

        return JSONResult.success();
    }
}
